package org.example.scoresystem_backen.service;

import org.example.scoresystem_backen.dto.AdminDTO;
import org.example.scoresystem_backen.dto.PageRequest;
import org.example.scoresystem_backen.dto.PageResponse;
import org.example.scoresystem_backen.entity.Admin;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.List;

/**
 * 管理员服务接口
 */
public interface AdminService {
    
    /**
     * 管理员登录
     * @param username 用户名
     * @param password 密码
     * @return 管理员信息
     */
    Admin login(String username, String password);
    
    /**
     * 创建管理员
     * @param admin 管理员信息
     * @return 创建的管理员
     */
    Admin createAdmin(Admin admin);
    
    /**
     * 更新管理员信息
     * @param admin 管理员信息
     * @return 更新后的管理员
     */
    Admin updateAdmin(Admin admin);
    
    /**
     * 删除管理员
     * @param id 管理员ID
     */
    void deleteAdmin(Integer id);
    
    /**
     * 根据ID查找管理员
     * @param id 管理员ID
     * @return 管理员信息
     */
    Admin findById(Integer id);
    
    /**
     * 根据用户名查找管理员
     * @param username 用户名
     * @return 管理员信息
     */
    Admin findByUsername(String username);
    
    /**
     * 获取所有管理员
     * @return 管理员列表
     */
    List<Admin> findAll();
    
    /**
     * 分页查询管理员
     * @param pageable 分页参数
     * @return 管理员分页数据
     */
    Page<Admin> findAll(Pageable pageable);
    
    /**
     * 根据角色查找管理员
     * @param role 角色
     * @return 管理员列表
     */
    List<Admin> findByRole(Admin.Role role);
    
    /**
     * 根据用户名模糊查询管理员
     * @param username 用户名关键字
     * @return 管理员列表
     */
    List<Admin> findByUsernameContaining(String username);
    
    /**
     * 检查用户名是否存在
     * @param username 用户名
     * @return 是否存在
     */
    boolean existsByUsername(String username);
    
    /**
     * 修改密码
     * @param id 管理员ID
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     * @return 是否修改成功
     */
    boolean changePassword(Integer id, String oldPassword, String newPassword);

    /**
     * 分页查询管理员列表（支持搜索和角色过滤）
     * @param pageRequest 分页请求参数
     * @return 管理员分页数据
     */
    PageResponse<AdminDTO> findAdminsByPage(PageRequest pageRequest);
}
